/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
'use strict';

var FORM_TOOLBAR = {
    ACTIONS: {

        saveModel: function (services) {

            _internalCreateModal({
                backdrop: true,
                keyboard: true,
                template: 'views/popup/form-save-model.html?version=' + Date.now(),
                scope: services.$scope
            }, services.$modal, services.$scope);
        },

        help: function (services) {

        },

        closeEditor: function (services) {
            if (services.$rootScope.editorHistory.length > 0) {
                var callback = function () {
                    services.$rootScope.formChanges = false;

                    var navigationObject = services.$rootScope.editorHistory.pop();
                    services.$location.path('/editor/' + navigationObject.id);
                };

                if (services.$rootScope.formChanges == true) {

                    services.$scope.$emit("formChangesEvent");

                    var unbindMustSave = services.$scope.$on("mustSaveEvent", function () {
                        //save the form data
                        var description = '';
                        if (services.$rootScope.currentForm.description) {
                            description = services.$rootScope.currentForm.description;
                        }

                        var data = {
                            newVersion: false
                        };
                        unbindEvents();
                        services.FormBuilderService.saveForm(data, services.$rootScope.currentForm.name, description, callback);
                    });

                    var unbindDiscardDataEvent = services.$scope.$on("discardDataEvent", function () {
                        unbindEvents();
                        callback();
                    });

                    var unbindContinueEditingEvent = services.$scope.$on("continueEditingEvent", function () {
                        unbindEvents();
                    });

                } else {
                    callback();
                }

            } else {
                services.$location.path('/forms');
            }

            var unbindEvents = function () {
                unbindContinueEditingEvent();
                unbindMustSave();
                unbindDiscardDataEvent();
            };

        }
    }
};

/** Custom controller for the save dialog */
angular.module('activitiModeler')
    .controller('SaveFormCtrl', ['$rootScope', '$scope', '$http', '$route', '$location', '$translate', 'FormBuilderService',
        function ($rootScope, $scope, $http, $route, $location, $translate, FormBuilderService) {

            var formKey = '';
            if ($rootScope.currentForm.key) {
                formKey = $rootScope.currentForm.key;
            }

            var description = '';
            if ($rootScope.currentForm.description) {
                description = $rootScope.currentForm.description;
            }

            var saveDialog = {
                name: $rootScope.currentForm.name,
                formKey: formKey,
                description: description,
                reusable: false,
                newVersion: false,
                comment: ''
            };

            $scope.saveDialog = saveDialog;

            $scope.status = {
                loading: false
            };

            $scope.cancel = function () {
                $scope.$hide();
            };

            $scope.saveAndClose = function () {
                $scope.save(function () {
                    if ($rootScope.editorHistory.length > 0) {
                        var navigationObject = $rootScope.editorHistory.pop();
                        $location.path('/editor/' + navigationObject.id);

                    } else {
                        $location.path('/forms');
                    }
                });
            };

            $scope.save = function (additionalSaveCallback) {

                if (!$scope.saveDialog.name || $scope.saveDialog.name.length == 0 ||
                    !$scope.saveDialog.formKey || $scope.saveDialog.formKey.length == 0) {

                    return;
                }

                // Indicator spinner image
                $scope.status = {
                    loading: true
                };

                var data = {
                    reusable: $scope.saveDialog.reusable,
                    newVersion: $scope.saveDialog.newVersion,
                    comment: $scope.saveDialog.comment
                };

                var saveCallback = function () {
                    $scope.$hide();
                    // TODO: i18n
                    $rootScope.addAlert("Saved form '" + $scope.saveDialog.name, 'info');
                    if (additionalSaveCallback) {
                        additionalSaveCallback();
                    }

                    $rootScope.formChanges = false;
                };

                var errorCallback = function (errorMessage) {
                    $scope.status.loading = false;
                    $scope.saveDialog.errorMessage = errorMessage.message;
                };

                FormBuilderService.saveForm(data, $scope.saveDialog.name, $scope.saveDialog.formKey,
                    $scope.saveDialog.description, saveCallback, errorCallback);
            };

            $scope.isOkButtonDisabled = function () {
                if ($scope.status.loading) {
                    return false;
                } else if ($scope.error && $scope.error.conflictResolveAction) {
                    if ($scope.error.conflictResolveAction === 'saveAs') {
                        return !$scope.error.saveAs || $scope.error.saveAs.length == 0;
                    } else {
                        return false;
                    }
                }
                return true;
            };

            $scope.okClicked = function () {
                if ($scope.error) {
                    if ($scope.error.conflictResolveAction === 'discardChanges') {
                        $scope.close();
                        $route.reload();
                    } else if ($scope.error.conflictResolveAction === 'overwrite'
                        || $scope.error.conflictResolveAction === 'newVersion') {
                        $scope.save();
                    } else if ($scope.error.conflictResolveAction === 'saveAs') {
                        $scope.save(function () {
                            $rootScope.ignoreChanges = true;  // Otherwise will get pop up that changes are not saved.
                            if ($rootScope.editorHistory.length > 0) {
                                var navigationObject = $rootScope.editorHistory.pop();
                                $location.path('/editor/' + navigationObject.id);

                            } else {
                                $location.path('/forms');
                            }
                        });
                    }
                }
            };

        }]);
